package gsw.tool.pluggable.hook.hook;

import gsw.tool.pluggable.hook.handler.BaseHandlerClass;

/**
 * 基础Hook类
 * 使用动态代理扩展系统对象，进行拦截修改
 */
public abstract class BaseHook {
    //系统对象
    protected Object realObj;
    //分发类：统一处理系统对象，对其方法扩展
    protected BaseHandlerClass classHandle;
    //是否启用Hook点，默认开启
    public boolean isEnable = true;

    public void setRealObj(Object realObj) {
        this.realObj = realObj;
        classHandle = createHookHandle();
    }

    //使用策略模式(父类分发，子类实现)生产分发类
    protected abstract BaseHandlerClass createHookHandle();

    /**
     * 初始化Hook类：拦截系统对象，替换执行内容
     *
     * @param classLoader 类加载器
     */
    public abstract void onInit(ClassLoader classLoader);

    public boolean isEnable() {
        return isEnable;
    }

    public void setEnable(boolean enable) {
        isEnable = enable;
    }
}
